home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / hplip / ui4 / setupdialog.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-10-28  |  38KB  |  1,101 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import socket
  5. import operator
  6. from base.g import *
  7. from base import device, utils, models, pkit
  8. from prnt import cups
  9. from base.codes import *
  10. from ui_utils import *
  11. from installer.core_install import CoreInstall
  12. from PyQt4.QtCore import *
  13. from PyQt4.QtGui import *
  14. from setupdialog_base import Ui_Dialog
  15. from plugindialog import PluginDialog
  16. from wifisetupdialog import WifiSetupDialog, SUCCESS_CONNECTED
  17.  
  18. try:
  19.     from fax import fax
  20.     fax_import_ok = True
  21. except ImportError:
  22.     fax_import_ok = False
  23.     log.warning('Fax setup disabled - Python 2.3+ required.')
  24.  
  25. PAGE_DISCOVERY = 0
  26. PAGE_DEVICES = 1
  27. PAGE_ADD_PRINTER = 2
  28. PAGE_REMOVE = 3
  29. BUTTON_NEXT = 0
  30. BUTTON_FINISH = 1
  31. BUTTON_ADD_PRINTER = 2
  32. BUTTON_REMOVE = 3
  33. ADVANCED_SHOW = 0
  34. ADVANCED_HIDE = 1
  35. DEVICE_DESC_ALL = 0
  36. DEVICE_DESC_SINGLE_FUNC = 1
  37. DEVICE_DESC_MULTI_FUNC = 2
  38.  
  39. class PasswordDialog(QDialog):
  40.     
  41.     def __init__(self, prompt, parent = None, name = None, modal = 0, fl = 0):
  42.         QDialog.__init__(self, parent)
  43.         self.prompt = prompt
  44.         Layout = QGridLayout(self)
  45.         Layout.setMargin(11)
  46.         Layout.setSpacing(6)
  47.         self.PromptTextLabel = QLabel(self)
  48.         Layout.addWidget(self.PromptTextLabel, 0, 0, 1, 3)
  49.         self.UsernameTextLabel = QLabel(self)
  50.         Layout.addWidget(self.UsernameTextLabel, 1, 0)
  51.         self.UsernameLineEdit = QLineEdit(self)
  52.         self.UsernameLineEdit.setEchoMode(QLineEdit.Normal)
  53.         Layout.addWidget(self.UsernameLineEdit, 1, 1, 1, 2)
  54.         self.PasswordTextLabel = QLabel(self)
  55.         Layout.addWidget(self.PasswordTextLabel, 2, 0)
  56.         self.PasswordLineEdit = QLineEdit(self)
  57.         self.PasswordLineEdit.setEchoMode(QLineEdit.Password)
  58.         Layout.addWidget(self.PasswordLineEdit, 2, 1, 1, 2)
  59.         self.OkPushButton = QPushButton(self)
  60.         Layout.addWidget(self.OkPushButton, 3, 2)
  61.         self.languageChange()
  62.         self.resize(QSize(420, 163).expandedTo(self.minimumSizeHint()))
  63.         self.connect(self.OkPushButton, SIGNAL('clicked()'), self.accept)
  64.         self.connect(self.PasswordLineEdit, SIGNAL('returnPressed()'), self.accept)
  65.  
  66.     
  67.     def getUsername(self):
  68.         return unicode(self.UsernameLineEdit.text())
  69.  
  70.     
  71.     def getPassword(self):
  72.         return unicode(self.PasswordLineEdit.text())
  73.  
  74.     
  75.     def languageChange(self):
  76.         self.setWindowTitle(self._PasswordDialog__tr('HP Device Manager - Enter Username/Password'))
  77.         self.PromptTextLabel.setText(self._PasswordDialog__tr(self.prompt))
  78.         self.UsernameTextLabel.setText(self._PasswordDialog__tr('Username:'))
  79.         self.PasswordTextLabel.setText(self._PasswordDialog__tr('Password:'))
  80.         self.OkPushButton.setText(self._PasswordDialog__tr('OK'))
  81.  
  82.     
  83.     def __tr(self, s, c = None):
  84.         return qApp.translate('SetupDialog', s, c)
  85.  
  86.  
  87.  
  88. def showPasswordUI(prompt):
  89.     
  90.     try:
  91.         dlg = PasswordDialog(prompt, None)
  92.         if dlg.exec_() == QDialog.Accepted:
  93.             return (dlg.getUsername(), dlg.getPassword())
  94.     finally:
  95.         pass
  96.  
  97.     return ('', '')
  98.  
  99.  
  100. class DeviceTableWidgetItem(QTableWidgetItem):
  101.     
  102.     def __init__(self, text, device_uri):
  103.         QTableWidgetItem.__init__(self, text, QTableWidgetItem.UserType)
  104.         self.device_uri = device_uri
  105.  
  106.  
  107.  
  108. class SetupDialog(QDialog, Ui_Dialog):
  109.     
  110.     def __init__(self, parent, param, jd_port, device_uri = None, remove = False):
  111.         QDialog.__init__(self, parent)
  112.         self.setupUi(self)
  113.         self.param = param
  114.         self.jd_port = jd_port
  115.         self.device_uri = device_uri
  116.         self.remove = remove
  117.         if device_uri:
  118.             log.info('Using device: %s' % device_uri)
  119.         
  120.         self.initUi()
  121.         if self.remove:
  122.             QTimer.singleShot(0, self.showRemovePage)
  123.         elif self.skip_discovery:
  124.             QTimer.singleShot(0, self.showDevicesPage)
  125.         else:
  126.             QTimer.singleShot(0, self.showDiscoveryPage)
  127.         cups.setPasswordCallback(showPasswordUI)
  128.  
  129.     
  130.     def initUi(self):
  131.         self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
  132.         self.connect(self.CancelButton, SIGNAL('clicked()'), self.CancelButton_clicked)
  133.         self.connect(self.BackButton, SIGNAL('clicked()'), self.BackButton_clicked)
  134.         self.connect(self.NextButton, SIGNAL('clicked()'), self.NextButton_clicked)
  135.         self.connect(self.ManualGroupBox, SIGNAL('clicked(bool)'), self.ManualGroupBox_clicked)
  136.         if self.remove:
  137.             self.initRemovePage()
  138.             self.max_page = 1
  139.         else:
  140.             self.initDiscoveryPage()
  141.             self.initDevicesPage()
  142.             self.initAddPrinterPage()
  143.             self.max_page = PAGE_ADD_PRINTER
  144.  
  145.     
  146.     def initDiscoveryPage(self):
  147.         self.UsbRadioButton.setChecked(True)
  148.         self.setUsbRadioButton(True)
  149.         self.ManualGroupBox.setChecked(False)
  150.         self.advanced = False
  151.         self.manual = False
  152.         self.skip_discovery = False
  153.         self.NetworkRadioButton.setEnabled(prop.net_build)
  154.         self.WirelessButton.setEnabled(prop.net_build)
  155.         self.ParallelRadioButton.setEnabled(prop.par_build)
  156.         self.devices = { }
  157.         self.bus = 'usb'
  158.         self.timeout = 5
  159.         self.ttl = 4
  160.         self.search = ''
  161.         self.print_test_page = False
  162.         self.device_desc = DEVICE_DESC_ALL
  163.         if self.param:
  164.             log.info('Searching for device...')
  165.             self.manual = True
  166.             self.advanced = True
  167.             self.ManualParamLineEdit.setText(self.param)
  168.             self.JetDirectSpinBox.setValue(self.jd_port)
  169.             self.ManualGroupBox.setChecked(True)
  170.             self.DiscoveryOptionsGroupBox.setEnabled(False)
  171.             if self.manualDiscovery():
  172.                 self.skip_discovery = True
  173.             else:
  174.                 FailureUI(self, self._SetupDialog__tr('<b>Device not found.</b> <p>Please make sure your printer is properly connected and powered-on.'))
  175.                 match = device.usb_pat.match(self.param)
  176.                 if match is not None:
  177.                     self.UsbRadioButton.setChecked(True)
  178.                     self.setUsbRadioButton(True)
  179.                 else:
  180.                     match = device.dev_pat.match(self.param)
  181.                     if match is not None and prop.par_build:
  182.                         self.ParallelRadioButton.setChecked(True)
  183.                         self.setParallelRadioButton(True)
  184.                     else:
  185.                         match = device.ip_pat.match(self.param)
  186.                         if match is not None and prop.net_build:
  187.                             self.NetworkRadioButton.setChecked(True)
  188.                             self.setNetworkRadioButton(True)
  189.                         else:
  190.                             FailureUI(self, self._SetupDialog__tr('<b>Invalid manual discovery parameter.</b>'))
  191.         elif self.device_uri:
  192.             
  193.             try:
  194.                 (back_end, is_hp, self.bus, model, serial, dev_file, host, zc, port) = device.parseDeviceURI(self.device_uri)
  195.             except Error:
  196.                 log.error('Invalid device URI specified: %s' % self.device_uri)
  197.  
  198.             name = host
  199.             if self.bus == 'net':
  200.                 
  201.                 try:
  202.                     log.debug('Trying to get hostname for device...')
  203.                     name = socket.gethostbyaddr(host)[0]
  204.                 except socket.herror:
  205.                     log.debug('Failed.')
  206.  
  207.                 log.debug('Host name=%s' % name)
  208.             
  209.             self.devices = {
  210.                 self.device_uri: (model, model, name) }
  211.             self.skip_discovery = True
  212.         elif not (prop.par_build) and not (prop.net_build):
  213.             self.skip_discovery = True
  214.             self.bus = 'usb'
  215.             self.UsbRadioButton.setChecked(True)
  216.             self.setUsbRadioButton(True)
  217.         
  218.         if prop.fax_build and prop.scan_build:
  219.             self.DeviceTypeComboBox.addItem('All devices/printers', QVariant(DEVICE_DESC_ALL))
  220.             self.DeviceTypeComboBox.addItem('Single function printers only', QVariant(DEVICE_DESC_SINGLE_FUNC))
  221.             self.DeviceTypeComboBox.addItem('All-in-one/MFP devices only', QVariant(DEVICE_DESC_MULTI_FUNC))
  222.         else:
  223.             self.DeviceTypeComboBox.setEnabled(False)
  224.         self.connect(self.AdvancedButton, SIGNAL('clicked()'), self.AdvancedButton_clicked)
  225.         self.connect(self.UsbRadioButton, SIGNAL('toggled(bool)'), self.UsbRadioButton_toggled)
  226.         self.connect(self.NetworkRadioButton, SIGNAL('toggled(bool)'), self.NetworkRadioButton_toggled)
  227.         self.connect(self.WirelessButton, SIGNAL('toggled(bool)'), self.WirelessButton_toggled)
  228.         self.connect(self.ParallelRadioButton, SIGNAL('toggled(bool)'), self.ParallelRadioButton_toggled)
  229.         self.connect(self.NetworkTTLSpinBox, SIGNAL('valueChanged(int)'), self.NetworkTTLSpinBox_valueChanged)
  230.         self.connect(self.NetworkTimeoutSpinBox, SIGNAL('valueChanged(int)'), self.NetworkTimeoutSpinBox_valueChanged)
  231.         self.connect(self.ManualGroupBox, SIGNAL('toggled(bool)'), self.ManualGroupBox_toggled)
  232.         self.showAdvanced()
  233.  
  234.     
  235.     def ManualGroupBox_toggled(self, checked):
  236.         self.DiscoveryOptionsGroupBox.setEnabled(not checked)
  237.  
  238.     
  239.     def manualDiscovery(self):
  240.         ret = False
  241.         (device_uri, sane_uri, fax_uri) = device.makeURI(self.param, self.jd_port)
  242.         if device_uri:
  243.             (back_end, is_hp, bus, model, serial, dev_file, host, zc, port) = device.parseDeviceURI(device_uri)
  244.             name = host
  245.             if bus == 'net':
  246.                 
  247.                 try:
  248.                     name = socket.gethostbyaddr(host)[0]
  249.                 except (socket.herror, socket.gaierror):
  250.                     pass
  251.                 except:
  252.                     None<EXCEPTION MATCH>(socket.herror, socket.gaierror)
  253.                 
  254.  
  255.             None<EXCEPTION MATCH>(socket.herror, socket.gaierror)
  256.             self.devices = {
  257.                 device_uri: (model, model, name) }
  258.             if bus == 'usb':
  259.                 self.UsbRadioButton.setChecked(True)
  260.                 self.setUsbRadioButton(True)
  261.             elif bus == 'net' and prop.net_build:
  262.                 self.NetworkRadioButton.setChecked(True)
  263.                 self.setNetworkRadioButton(True)
  264.             elif bus == 'par' and prop.par_build:
  265.                 self.ParallelRadioButton.setChecked(True)
  266.                 self.setParallelRadioButton(True)
  267.             
  268.             ret = True
  269.         
  270.         return ret
  271.  
  272.     
  273.     def ManualGroupBox_clicked(self, checked):
  274.         self.manual = checked
  275.         network = self.NetworkRadioButton.isChecked()
  276.         self.setJetDirect(network)
  277.  
  278.     
  279.     def showDiscoveryPage(self):
  280.         self.BackButton.setEnabled(False)
  281.         self.NextButton.setEnabled(True)
  282.         self.setNextButton(BUTTON_NEXT)
  283.         self.displayPage(PAGE_DISCOVERY)
  284.  
  285.     
  286.     def AdvancedButton_clicked(self):
  287.         self.advanced = not (self.advanced)
  288.         self.showAdvanced()
  289.  
  290.     
  291.     def showAdvanced(self):
  292.         if self.advanced:
  293.             self.AdvancedStackedWidget.setCurrentIndex(ADVANCED_SHOW)
  294.             self.AdvancedButton.setText(self._SetupDialog__tr('Hide Advanced Options'))
  295.             self.AdvancedButton.setIcon(QIcon(load_pixmap('minus', '16x16')))
  296.         else:
  297.             self.AdvancedStackedWidget.setCurrentIndex(ADVANCED_HIDE)
  298.             self.AdvancedButton.setText(self._SetupDialog__tr('Show Advanced Options'))
  299.             self.AdvancedButton.setIcon(QIcon(load_pixmap('plus', '16x16')))
  300.  
  301.     
  302.     def setJetDirect(self, enabled):
  303.         if enabled:
  304.             pass
  305.         self.JetDirectLabel.setEnabled(self.manual)
  306.         if enabled:
  307.             pass
  308.         self.JetDirectSpinBox.setEnabled(self.manual)
  309.  
  310.     
  311.     def setNetworkOptions(self, enabled):
  312.         self.NetworkTimeoutLabel.setEnabled(enabled)
  313.         self.NetworkTimeoutSpinBox.setEnabled(enabled)
  314.         self.NetworkTTLLabel.setEnabled(enabled)
  315.         self.NetworkTTLSpinBox.setEnabled(enabled)
  316.  
  317.     
  318.     def setSearchOptions(self, enabled):
  319.         self.SearchLineEdit.setEnabled(enabled)
  320.         self.DeviceTypeComboBox.setEnabled(enabled)
  321.         self.DeviceTypeLabel.setEnabled(enabled)
  322.  
  323.     
  324.     def setManualDiscovery(self, enabled):
  325.         self.ManualGroupBox.setEnabled(enabled)
  326.  
  327.     
  328.     def setNetworkDiscovery(self, enabled):
  329.         self.NetworkDiscoveryMethodLabel.setEnabled(enabled)
  330.         self.NetworkDiscoveryMethodComboBox.setEnabled(enabled)
  331.         self.NetworkDiscoveryMethodComboBox.setCurrentIndex(1)
  332.  
  333.     
  334.     def UsbRadioButton_toggled(self, radio_enabled):
  335.         self.setUsbRadioButton(radio_enabled)
  336.  
  337.     
  338.     def setUsbRadioButton(self, checked):
  339.         self.setNetworkDiscovery(not checked)
  340.         self.setJetDirect(not checked)
  341.         self.setNetworkOptions(not checked)
  342.         self.setSearchOptions(checked)
  343.         self.setManualDiscovery(checked)
  344.         if checked:
  345.             self.ManualParamLabel.setText(self._SetupDialog__tr('USB bus ID:device ID (bbb:ddd):'))
  346.             self.bus = 'usb'
  347.         
  348.  
  349.     
  350.     def NetworkRadioButton_toggled(self, radio_enabled):
  351.         self.setNetworkRadioButton(radio_enabled)
  352.  
  353.     
  354.     def setNetworkRadioButton(self, checked):
  355.         self.setNetworkDiscovery(checked)
  356.         self.setJetDirect(checked)
  357.         self.setNetworkOptions(checked)
  358.         self.setSearchOptions(checked)
  359.         self.setManualDiscovery(checked)
  360.         if checked:
  361.             self.ManualParamLabel.setText(self._SetupDialog__tr('IP Address or network name:'))
  362.             self.bus = 'net'
  363.         
  364.  
  365.     
  366.     def WirelessButton_toggled(self, radio_enabled):
  367.         self.setWirelessButton(radio_enabled)
  368.  
  369.     
  370.     def setWirelessButton(self, checked):
  371.         self.setNetworkDiscovery(not checked)
  372.         self.setJetDirect(not checked)
  373.         self.setNetworkOptions(not checked)
  374.         self.setSearchOptions(not checked)
  375.         self.setManualDiscovery(not checked)
  376.         if checked:
  377.             self.ManualParamLabel.setText(self._SetupDialog__tr('IP Address or network name:'))
  378.             self.bus = 'net'
  379.         
  380.  
  381.     
  382.     def ParallelRadioButton_toggled(self, radio_enabled):
  383.         self.setParallelRadioButton(radio_enabled)
  384.  
  385.     
  386.     def setParallelRadioButton(self, checked):
  387.         self.setNetworkDiscovery(not checked)
  388.         self.setJetDirect(not checked)
  389.         self.setNetworkOptions(not checked)
  390.         self.setSearchOptions(not checked)
  391.         self.setManualDiscovery(not checked)
  392.         if checked:
  393.             self.ManualParamLabel.setText(self._SetupDialog__tr('Device node (/dev/...):'))
  394.             self.bus = 'par'
  395.         
  396.  
  397.     
  398.     def NetworkTTLSpinBox_valueChanged(self, ttl):
  399.         self.ttl = ttl
  400.  
  401.     
  402.     def NetworkTimeoutSpinBox_valueChanged(self, timeout):
  403.         self.timeout = timeout
  404.  
  405.     
  406.     def initDevicesPage(self):
  407.         self.connect(self.RefreshButton, SIGNAL('clicked()'), self.RefreshButton_clicked)
  408.  
  409.     
  410.     def showDevicesPage(self):
  411.         self.BackButton.setEnabled(True)
  412.         self.setNextButton(BUTTON_NEXT)
  413.         search = ''
  414.         QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
  415.         
  416.         try:
  417.             if not self.devices:
  418.                 if self.manual and self.param:
  419.                     self.manualDiscovery()
  420.                 else:
  421.                     net_search_type = ''
  422.                     None(log.info % ('Searching... (bus=%s, search=%s, desc=%d)', self.bus if self.bus == 'net' else '(None)', self.device_desc))
  423.                     if self.device_desc == DEVICE_DESC_SINGLE_FUNC:
  424.                         filter_dict = {
  425.                             'scan-type': (operator.le, SCAN_TYPE_NONE) }
  426.                     elif self.device_desc == DEVICE_DESC_MULTI_FUNC:
  427.                         filter_dict = {
  428.                             'scan-type': (operator.gt, SCAN_TYPE_NONE) }
  429.                     else:
  430.                         filter_dict = { }
  431.                     self.devices = device.probeDevices([
  432.                         self.bus], self.timeout, self.ttl, filter_dict, self.search, net_search = net_search_type)
  433.         finally:
  434.             QApplication.restoreOverrideCursor()
  435.  
  436.         self.clearDevicesTable()
  437.         if self.devices:
  438.             self.NextButton.setEnabled(True)
  439.             self.DevicesFoundIcon.setPixmap(load_pixmap('info', '16x16'))
  440.             if len(self.devices) == 1:
  441.                 self.DevicesFoundLabel.setText(self._SetupDialog__tr('<b>1 device found.</b> Click <i>Next</i> to continue.'))
  442.             else:
  443.                 self.DevicesFoundLabel.setText(self._SetupDialog__tr('<b>%1 devices found.</b> Select the device to install and click <i>Next</i> to continue.').arg(len(self.devices)))
  444.             self.loadDevicesTable()
  445.         else:
  446.             self.NextButton.setEnabled(False)
  447.             self.DevicesFoundIcon.setPixmap(load_pixmap('error', '16x16'))
  448.             log.error('No devices found on bus: %s' % self.bus)
  449.             self.DevicesFoundLabel.setText(self._SetupDialog__tr('<b>No devices found.</b><br>Click <i>Back</i> to change discovery options, or <i>Refresh</i> to search again.'))
  450.         self.displayPage(PAGE_DEVICES)
  451.  
  452.     
  453.     def loadDevicesTable(self):
  454.         self.DevicesTableWidget.setRowCount(len(self.devices))
  455.         if self.bus == 'net':
  456.             if self.discovery_method == 0:
  457.                 headers = [
  458.                     self._SetupDialog__tr('Model'),
  459.                     self._SetupDialog__tr('IP Address'),
  460.                     self._SetupDialog__tr('Host Name'),
  461.                     self._SetupDialog__tr('Device URI')]
  462.                 device_uri_col = 3
  463.             else:
  464.                 headers = [
  465.                     self._SetupDialog__tr('Model'),
  466.                     self._SetupDialog__tr('Host Name'),
  467.                     self._SetupDialog__tr('Device URI')]
  468.                 device_uri_col = 2
  469.         else:
  470.             headers = [
  471.                 self._SetupDialog__tr('Model'),
  472.                 self._SetupDialog__tr('Device URI')]
  473.             device_uri_col = 1
  474.         self.DevicesTableWidget.setColumnCount(len(headers))
  475.         self.DevicesTableWidget.setHorizontalHeaderLabels(headers)
  476.         flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
  477.         for row, d in enumerate(self.devices):
  478.             (back_end, is_hp, bus, model, serial, dev_file, host, zc, port) = device.parseDeviceURI(d)
  479.             model_ui = models.normalizeModelUIName(model)
  480.             i = DeviceTableWidgetItem(QString(model_ui), d)
  481.             i.setFlags(flags)
  482.             self.DevicesTableWidget.setItem(row, 0, i)
  483.             i = QTableWidgetItem(QString(d))
  484.             i.setFlags(flags)
  485.             self.DevicesTableWidget.setItem(row, device_uri_col, i)
  486.             if self.bus == 'net':
  487.                 i = QTableWidgetItem(QString(host))
  488.                 i.setFlags(flags)
  489.                 self.DevicesTableWidget.setItem(row, 1, i)
  490.                 if self.discovery_method == 0:
  491.                     i = QTableWidgetItem(QString(self.devices[d][2]))
  492.                     i.setFlags(flags)
  493.                     self.DevicesTableWidget.setItem(row, 2, i)
  494.                 
  495.             self.discovery_method == 0
  496.         
  497.         self.DevicesTableWidget.resizeColumnsToContents()
  498.         self.DevicesTableWidget.selectRow(0)
  499.         self.DevicesTableWidget.setSortingEnabled(True)
  500.         self.DevicesTableWidget.sortItems(0)
  501.  
  502.     
  503.     def clearDevicesTable(self):
  504.         self.DevicesTableWidget.clear()
  505.         self.DevicesTableWidget.setRowCount(0)
  506.         self.DevicesTableWidget.setColumnCount(0)
  507.  
  508.     
  509.     def RefreshButton_clicked(self):
  510.         self.clearDevicesTable()
  511.         self.devices = []
  512.         QTimer.singleShot(0, self.showDevicesPage)
  513.  
  514.     
  515.     def initAddPrinterPage(self):
  516.         self.mq = { }
  517.         self.connect(self.PrinterNameLineEdit, SIGNAL('textEdited(const QString &)'), self.PrinterNameLineEdit_textEdited)
  518.         self.connect(self.FaxNameLineEdit, SIGNAL('textEdited(const QString &)'), self.FaxNameLineEdit_textEdited)
  519.         self.PrinterNameLineEdit.setValidator(PrinterNameValidator(self.PrinterNameLineEdit))
  520.         self.FaxNameLineEdit.setValidator(PrinterNameValidator(self.FaxNameLineEdit))
  521.         self.FaxNumberLineEdit.setValidator(PhoneNumValidator(self.FaxNumberLineEdit))
  522.         self.OtherPPDButton.setIcon(QIcon(load_pixmap('folder_open', '16x16')))
  523.         self.connect(self.OtherPPDButton, SIGNAL('clicked(bool)'), self.OtherPPDButton_clicked)
  524.         self.OtherPPDButton.setToolTip(self._SetupDialog__tr('Browse for an alternative PPD file for this printer.'))
  525.         self.printer_fax_names_same = False
  526.         self.printer_name = ''
  527.         self.fax_name = ''
  528.         self.fax_setup_ok = True
  529.         self.fax_setup = False
  530.  
  531.     
  532.     def showAddPrinterPage(self):
  533.         core = CoreInstall()
  534.         plugin = self.mq.get('plugin', PLUGIN_NONE)
  535.         plugin_reason = self.mq.get('plugin-reason', PLUGIN_REASON_NONE)
  536.         if plugin > PLUGIN_NONE:
  537.             if not core.check_for_plugin():
  538.                 (ok, sudo_ok) = pkit.run_plugin_command(plugin == PLUGIN_REQUIRED, plugin_reason)
  539.                 if not sudo_ok:
  540.                     FailureUI(self, self._SetupDialog__tr('<b>Unable to find an appropriate su/sudo utiltity to run hp-plugin.</b><p>Install kdesu, gnomesu, or gksu.</p>'))
  541.                     return None
  542.                 if not ok or not core.check_for_plugin():
  543.                     if plugin == PLUGIN_REQUIRED:
  544.                         FailureUI(self, self._SetupDialog__tr('<b>The printer you are trying to setup requires a binary driver plug-in and it failed to install.</b><p>Please check your internet connection and try again.</p><p>Visit <u>http://hplipopensource.com</u> for more infomation.</p>'))
  545.                         return None
  546.                     WarningUI(self, self._SetupDialog__tr('Either you have chosen to skip the installation of the optional plug-in or that installation has failed.  Your printer may not function at optimal performance.'))
  547.                 
  548.             
  549.         
  550.         self.setNextButton(BUTTON_ADD_PRINTER)
  551.         if not self.printer_name:
  552.             self.setDefaultPrinterName()
  553.         
  554.         self.findPrinterPPD()
  555.         if fax_import_ok and prop.fax_build and self.mq.get('fax-type', FAX_TYPE_NONE) not in (FAX_TYPE_NONE, FAX_TYPE_NOT_SUPPORTED):
  556.             self.fax_setup = True
  557.             self.SetupFaxGroupBox.setChecked(True)
  558.             self.SetupFaxGroupBox.setEnabled(True)
  559.             if not self.fax_name:
  560.                 self.setDefaultFaxName()
  561.             
  562.             self.findFaxPPD()
  563.             self.readwriteFaxInformation()
  564.         else:
  565.             self.SetupFaxGroupBox.setChecked(False)
  566.             self.SetupFaxGroupBox.setEnabled(False)
  567.             self.fax_name = ''
  568.             self.fax_name_ok = True
  569.             self.fax_setup = False
  570.             self.fax_setup_ok = True
  571.         self.updatePPD()
  572.         self.setAddPrinterButton()
  573.         self.displayPage(PAGE_ADD_PRINTER)
  574.  
  575.     
  576.     def updatePPD(self):
  577.         if self.print_ppd is None:
  578.             log.error('No appropriate print PPD file found for model %s' % self.model)
  579.             self.PPDFileLineEdit.setText(self._SetupDialog__tr('(Not found. Click browse button to select a PPD file.)'))
  580.             
  581.             try:
  582.                 self.PPDFileLineEdit.setStyleSheet('background-color: yellow')
  583.             except AttributeError:
  584.                 pass
  585.  
  586.             self.PrinterDescriptionLineEdit.setText(QString(''))
  587.         else:
  588.             self.PPDFileLineEdit.setText(self.print_ppd[0])
  589.             self.PrinterDescriptionLineEdit.setText(self.print_ppd[1])
  590.             
  591.             try:
  592.                 self.PPDFileLineEdit.setStyleSheet('')
  593.             except AttributeError:
  594.                 pass
  595.  
  596.  
  597.     
  598.     def OtherPPDButton_clicked(self, b):
  599.         ppd_file = unicode(QFileDialog.getOpenFileName(self, self._SetupDialog__tr('Select PPD File'), sys_conf.get('dirs', 'ppd'), self._SetupDialog__tr('PPD Files (*.ppd *.ppd.gz);;All Files (*)')))
  600.         if ppd_file and os.path.exists(ppd_file):
  601.             self.print_ppd = (ppd_file, cups.getPPDDescription(ppd_file))
  602.             self.updatePPD()
  603.             self.setAddPrinterButton()
  604.         
  605.  
  606.     
  607.     def findPrinterPPD(self):
  608.         QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
  609.         
  610.         try:
  611.             self.print_ppd = None
  612.             self.ppds = cups.getSystemPPDs()
  613.             model = cups.stripModel2(self.model)
  614.             self.print_ppd = cups.getPPDFile2(model, self.ppds)
  615.         finally:
  616.             QApplication.restoreOverrideCursor()
  617.  
  618.  
  619.     
  620.     def findFaxPPD(self):
  621.         QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
  622.         
  623.         try:
  624.             log.debug('Searching for fax PPD for model %s' % self.model)
  625.             if prop.hpcups_build:
  626.                 if self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_SOAP:
  627.                     fax_ppd_name = 'HP-Fax2-hpcups'
  628.                     nick = 'HP Fax2 hpcups'
  629.                 else:
  630.                     fax_ppd_name = 'HP-Fax-hpcups'
  631.                     nick = 'HP Fax hpcups'
  632.             elif self.mq.get('fax-type', FAX_TYPE_NONE) == FAX_TYPE_SOAP:
  633.                 fax_ppd_name = 'HP-Fax2-hpijs'
  634.                 nick = 'HP Fax2 hpijs'
  635.             else:
  636.                 fax_ppd_name = 'HP-Fax-hpijs'
  637.                 nick = 'HP Fax hpijs'
  638.             ppds = []
  639.             for f in utils.walkFiles(sys_conf.get('dirs', 'ppd'), pattern = 'HP-Fax*.ppd*', abs_paths = True):
  640.                 ppds.append(f)
  641.             
  642.             for f in ppds:
  643.                 if f.find(fax_ppd_name) >= 0 and cups.getPPDDescription(f) == nick:
  644.                     self.fax_ppd = f
  645.                     self.fax_setup_ok = True
  646.                     log.debug('Found fax PPD: %s' % f)
  647.                     break
  648.                     continue
  649.             else:
  650.                 self.fax_ppd = None
  651.                 self.fax_setup_ok = False
  652.                 self.fax_setup = False
  653.                 self.SetupFaxGroupBox.setChecked(False)
  654.                 self.SetupFaxGroupBox.setEnabled(False)
  655.         finally:
  656.             QApplication.restoreOverrideCursor()
  657.  
  658.  
  659.     
  660.     def setDefaultPrinterName(self):
  661.         self.installed_print_devices = device.getSupportedCUPSDevices([
  662.             'hp'])
  663.         log.debug(self.installed_print_devices)
  664.         self.installed_queues = [ p.name for p in cups.getPrinters() ]
  665.         (back_end, is_hp, bus, model, serial, dev_file, host, zc, port) = device.parseDeviceURI(self.device_uri)
  666.         default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
  667.         printer_name = default_model
  668.         self.printer_name_ok = True
  669.         self.PrinterNameLineEdit.setText(printer_name)
  670.         log.debug(printer_name)
  671.         self.printer_name = printer_name
  672.  
  673.     
  674.     def setDefaultFaxName(self):
  675.         self.installed_fax_devices = device.getSupportedCUPSDevices([
  676.             'hpfax'])
  677.         log.debug(self.installed_fax_devices)
  678.         self.fax_uri = self.device_uri.replace('hp:', 'hpfax:')
  679.         (back_end, is_hp, bus, model, serial, dev_file, host, zc, port) = device.parseDeviceURI(self.fax_uri)
  680.         default_model = utils.xstrip(model.replace('series', '').replace('Series', ''), '_')
  681.         fax_name = default_model + '_fax'
  682.         if self.fax_uri in self.installed_fax_devices and fax_name in self.installed_fax_devices[self.fax_uri]:
  683.             i = 2
  684.             while True:
  685.                 t = fax_name + '_%d' % i
  686.                 if t not in self.installed_fax_devices[self.fax_uri]:
  687.                     fax_name += '_%d' % i
  688.                     break
  689.                 
  690.                 i += 1
  691.         
  692.         self.fax_name_ok = True
  693.         self.FaxNameLineEdit.setText(fax_name)
  694.         self.fax_name = fax_name
  695.  
  696.     
  697.     def PrinterNameLineEdit_textEdited(self, t):
  698.         self.printer_name = unicode(t)
  699.         self.printer_name_ok = True
  700.         if not self.printer_name:
  701.             self.PrinterNameLineEdit.setToolTip(self._SetupDialog__tr('You must enter a name for the printer.'))
  702.             self.printer_name_ok = False
  703.         elif self.fax_name == self.printer_name:
  704.             s = self._SetupDialog__tr('The printer name and fax name must be different. Please choose different names.')
  705.             self.PrinterNameLineEdit.setToolTip(s)
  706.             self.FaxNameLineEdit.setToolTip(s)
  707.             self.fax_name_ok = False
  708.             self.printer_name_ok = False
  709.             self.printer_fax_names_same = True
  710.         elif self.printer_name in self.installed_queues:
  711.             self.PrinterNameLineEdit.setToolTip(self._SetupDialog__tr('A printer already exists with this name. Please choose a different name.'))
  712.             self.printer_name_ok = False
  713.         elif self.printer_fax_names_same:
  714.             if self.fax_name != self.printer_name:
  715.                 self.printer_fax_names_same = False
  716.                 self.printer_name_ok = True
  717.                 self.FaxNameLineEdit.emit(SIGNAL('textChanged(const QString &)'), (self.FaxNameLineEdit.text(),))
  718.             
  719.         
  720.         self.setIndicators()
  721.         self.setAddPrinterButton()
  722.  
  723.     
  724.     def FaxNameLineEdit_textEdited(self, t):
  725.         self.fax_name = unicode(t)
  726.         self.fax_name_ok = True
  727.         if not self.fax_name:
  728.             self.FaxNameLineEdit.setToolTip(self._SetupDialog__tr('You must enter a fax name.'))
  729.             self.fax_name_ok = False
  730.         elif self.fax_name == self.printer_name:
  731.             s = self._SetupDialog__tr('The printer name and fax name must be different. Please choose different names.')
  732.             self.PrinterNameLineEdit.setToolTip(s)
  733.             self.FaxNameLineEdit.setToolTip(s)
  734.             self.printer_name_ok = False
  735.             self.fax_name_ok = False
  736.             self.printer_fax_names_same = True
  737.         elif self.fax_name in self.installed_queues:
  738.             self.FaxNameLineEdit.setToolTip(self._SetupDialog__tr('A fax already exists with this name. Please choose a different name.'))
  739.             self.fax_name_ok = False
  740.         elif self.printer_fax_names_same:
  741.             if self.fax_name != self.printer_name:
  742.                 self.printer_fax_names_same = False
  743.                 self.fax_name_ok = True
  744.                 self.PrinterNameLineEdit.emit(SIGNAL('textChanged(const QString&)'), (self.PrinterNameLineEdit.text(),))
  745.             
  746.         
  747.         self.setIndicators()
  748.         self.setAddPrinterButton()
  749.  
  750.     
  751.     def setIndicators(self):
  752.         if self.printer_name_ok:
  753.             self.PrinterNameLineEdit.setToolTip(QString(''))
  754.             
  755.             try:
  756.                 self.PrinterNameLineEdit.setStyleSheet('')
  757.             except AttributeError:
  758.                 pass
  759.             except:
  760.                 None<EXCEPTION MATCH>AttributeError
  761.             
  762.  
  763.         None<EXCEPTION MATCH>AttributeError
  764.         
  765.         try:
  766.             self.PrinterNameLineEdit.setStyleSheet('background-color: yellow')
  767.         except AttributeError:
  768.             pass
  769.  
  770.         if self.fax_name_ok:
  771.             self.FaxNameLineEdit.setToolTip(QString(''))
  772.             
  773.             try:
  774.                 self.PrinterNameLineEdit.setStyleSheet('')
  775.             except AttributeError:
  776.                 pass
  777.             except:
  778.                 None<EXCEPTION MATCH>AttributeError
  779.             
  780.  
  781.         None<EXCEPTION MATCH>AttributeError
  782.         
  783.         try:
  784.             self.PrinterNameLineEdit.setStyleSheet('background-color: yellow')
  785.         except AttributeError:
  786.             pass
  787.  
  788.  
  789.     
  790.     def setAddPrinterButton(self):
  791.         if self.printer_name_ok and self.print_ppd is not None:
  792.             if not self.fax_setup or self.fax_name_ok:
  793.                 pass
  794.         self.NextButton.setEnabled(not (self.fax_setup))
  795.  
  796.     
  797.     def addPrinter(self):
  798.         self.setupPrinter()
  799.         if self.fax_setup:
  800.             self.setupFax()
  801.             self.readwriteFaxInformation(False)
  802.         
  803.         if self.print_test_page:
  804.             self.printTestPage()
  805.         
  806.         self.close()
  807.  
  808.     
  809.     def setupPrinter(self):
  810.         QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
  811.         
  812.         try:
  813.             cups.setPasswordPrompt('You do not have permission to add a printer.')
  814.             if not os.path.exists(self.print_ppd[0]):
  815.                 (status, status_str) = cups.addPrinter(self.printer_name.encode('utf8'), self.device_uri, self.print_location, '', self.print_ppd[0], self.print_desc)
  816.             else:
  817.                 (status, status_str) = cups.addPrinter(self.printer_name.encode('utf8'), self.device_uri, self.print_location, self.print_ppd[0], '', self.print_desc)
  818.             log.debug('addPrinter() returned (%d, %s)' % (status, status_str))
  819.             self.installed_print_devices = device.getSupportedCUPSDevices([
  820.                 'hp'])
  821.             log.debug(self.installed_print_devices)
  822.             if self.device_uri not in self.installed_print_devices or self.printer_name not in self.installed_print_devices[self.device_uri]:
  823.                 QApplication.restoreOverrideCursor()
  824.                 FailureUI(self, self._SetupDialog__tr('<b>Printer queue setup failed.</b><p>Please restart CUPS and try again.'))
  825.         finally:
  826.             QApplication.restoreOverrideCursor()
  827.  
  828.  
  829.     
  830.     def setupFax(self):
  831.         QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
  832.         
  833.         try:
  834.             cups.setPasswordPrompt('You do not have permission to add a fax device.')
  835.             if not os.path.exists(self.fax_ppd):
  836.                 (status, status_str) = cups.addPrinter(self.fax_name.encode('utf8'), self.fax_uri, self.fax_location, '', self.fax_ppd, self.fax_desc)
  837.             else:
  838.                 (status, status_str) = cups.addPrinter(self.fax_name.encode('utf8'), self.fax_uri, self.fax_location, self.fax_ppd, '', self.fax_desc)
  839.             log.debug('addPrinter() returned (%d, %s)' % (status, status_str))
  840.             self.installed_fax_devices = device.getSupportedCUPSDevices([
  841.                 'hpfax'])
  842.             log.debug(self.installed_fax_devices)
  843.             if self.fax_uri not in self.installed_fax_devices or self.fax_name not in self.installed_fax_devices[self.fax_uri]:
  844.                 QApplication.restoreOverrideCursor()
  845.                 FailureUI(self, self._SetupDialog__tr('<b>Fax queue setup failed.</b><p>Please restart CUPS and try again.'))
  846.         finally:
  847.             QApplication.restoreOverrideCursor()
  848.  
  849.  
  850.     
  851.     def readwriteFaxInformation(self, read = True):
  852.         
  853.         try:
  854.             QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
  855.             d = fax.getFaxDevice(self.fax_uri, disable_dbus = True)
  856.             while True:
  857.                 
  858.                 try:
  859.                     d.open()
  860.                 except Error:
  861.                     error_text = self._SetupDialog__tr('Unable to communicate with the device. Please check the device and try again.')
  862.                     log.error(unicode(error_text))
  863.                     if QMessageBox.critical(self, self.windowTitle(), error_text, QMessageBox.Retry | QMessageBox.Default, QMessageBox.Cancel | QMessageBox.Escape, QMessageBox.NoButton) == QMessageBox.Cancel:
  864.                         break
  865.                     
  866.                     QMessageBox.critical(self, self.windowTitle(), error_text, QMessageBox.Retry | QMessageBox.Default, QMessageBox.Cancel | QMessageBox.Escape, QMessageBox.NoButton) == QMessageBox.Cancel
  867.  
  868.                 
  869.                 try:
  870.                     tries = 0
  871.                     ok = True
  872.                     while True:
  873.                         tries += 1
  874.                         
  875.                         try:
  876.                             if read:
  877.                                 self.fax_number = unicode(d.getPhoneNum())
  878.                                 self.fax_name_company = unicode(d.getStationName())
  879.                             else:
  880.                                 d.setStationName(self.fax_name_company)
  881.                                 d.setPhoneNum(self.fax_number)
  882.                         except Error:
  883.                             error_text = self._SetupDialog__tr('<b>Device I/O Error</b><p>Could not communicate with device. Device may be busy.')
  884.                             log.error(unicode(error_text))
  885.                             if QMessageBox.critical(self, self.windowTitle(), error_text, QMessageBox.Retry | QMessageBox.Default, QMessageBox.Cancel | QMessageBox.Escape, QMessageBox.NoButton) == QMessageBox.Cancel:
  886.                                 break
  887.                             
  888.                             time.sleep(5)
  889.                             ok = False
  890.                             if tries > 12:
  891.                                 break
  892.                             
  893.                             tries > 12
  894.  
  895.                         ok = True
  896.                         break
  897.                 finally:
  898.                     d.close()
  899.  
  900.                 if ok and read:
  901.                     self.FaxNumberLineEdit.setText(self.fax_number)
  902.                     self.NameCompanyLineEdit.setText(self.fax_name_company)
  903.                 
  904.                 break
  905.         finally:
  906.             QApplication.restoreOverrideCursor()
  907.  
  908.  
  909.     
  910.     def printTestPage(self):
  911.         
  912.         try:
  913.             d = device.Device(self.device_uri)
  914.         except Error:
  915.             e = None
  916.             FailureUI(self, self._SetupDialog__tr('<b>Device error:</b><p>%s (%s).' % (e.msg, e.opt)))
  917.  
  918.         
  919.         try:
  920.             d.open()
  921.         except Error:
  922.             FailureUI(self, self._SetupDialog__tr('<b>Unable to print to printer.</b><p>Please check device and try again.'))
  923.  
  924.         if d.isIdleAndNoError():
  925.             d.close()
  926.             
  927.             try:
  928.                 d.printTestPage(self.printer_name)
  929.             except Error:
  930.                 e = None
  931.                 if e.opt == ERROR_NO_CUPS_QUEUE_FOUND_FOR_DEVICE:
  932.                     FailureUI(self, self._SetupDialog__tr('<b>No CUPS queue found for device.</b><p>Please install the printer in CUPS and try again.'))
  933.                 else:
  934.                     FailureUI(self, self._SetupDialog__tr('<b>Printer Error</b><p>An error occured: %s (code=%d).' % (e.msg, e.opt)))
  935.             except:
  936.                 e.opt == ERROR_NO_CUPS_QUEUE_FOUND_FOR_DEVICE
  937.             
  938.  
  939.         None<EXCEPTION MATCH>Error
  940.         FailureUI(self, self._SetupDialog__tr('<b>Printer Error.</b><p>Printer is busy, offline, or in an error state. Please check the device and try again.'))
  941.         d.close()
  942.  
  943.     
  944.     def initRemovePage(self):
  945.         pass
  946.  
  947.     
  948.     def showRemovePage(self):
  949.         self.displayPage(PAGE_REMOVE)
  950.         self.StepText.setText(self._SetupDialog__tr('Step 1 of 1'))
  951.         self.setNextButton(BUTTON_REMOVE)
  952.         self.BackButton.setEnabled(False)
  953.         self.NextButton.setEnabled(False)
  954.         self.RemoveDevicesTableWidget.verticalHeader().hide()
  955.         self.installed_printers = device.getSupportedCUPSPrinters([
  956.             'hp',
  957.             'hpfax'])
  958.         log.debug(self.installed_printers)
  959.         if not self.installed_printers:
  960.             FailureUI(self, self._SetupDialog__tr('<b>No printers or faxes found to remove.</b><p>You must setup a least one printer or fax before you can remove it.'))
  961.             self.close()
  962.             return None
  963.         self.RemoveDevicesTableWidget.setRowCount(len(self.installed_printers))
  964.         headers = [
  965.             self._SetupDialog__tr('Select'),
  966.             self._SetupDialog__tr('Printer (Queue) Name'),
  967.             self._SetupDialog__tr('Type'),
  968.             self._SetupDialog__tr('Device URI')]
  969.         self.RemoveDevicesTableWidget.setColumnCount(len(headers))
  970.         self.RemoveDevicesTableWidget.setHorizontalHeaderLabels(headers)
  971.         flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
  972.         row = 0
  973.         for p in self.installed_printers:
  974.             widget = QCheckBox(self.RemoveDevicesTableWidget)
  975.             self.connect(widget, SIGNAL('stateChanged(int)'), self.CheckBox_stateChanged)
  976.             self.RemoveDevicesTableWidget.setCellWidget(row, 0, widget)
  977.             (back_end, is_hp, bus, model, serial, dev_file, host, zc, port) = device.parseDeviceURI(p.device_uri)
  978.             if self.device_uri is not None and self.device_uri == p.device_uri:
  979.                 widget.setCheckState(Qt.Checked)
  980.             
  981.             i = QTableWidgetItem(QString(p.name))
  982.             i.setFlags(flags)
  983.             i.setData(Qt.UserRole, QVariant(p.name))
  984.             self.RemoveDevicesTableWidget.setItem(row, 1, i)
  985.             if back_end == 'hpfax':
  986.                 typ = self._SetupDialog__tr('Fax')
  987.             else:
  988.                 typ = self._SetupDialog__tr('Printer')
  989.             i = QTableWidgetItem(typ)
  990.             i.setFlags(flags)
  991.             self.RemoveDevicesTableWidget.setItem(row, 2, i)
  992.             i = QTableWidgetItem(QString(p.device_uri))
  993.             i.setFlags(flags)
  994.             self.RemoveDevicesTableWidget.setItem(row, 3, i)
  995.             row += 1
  996.         
  997.         self.RemoveDevicesTableWidget.resizeColumnsToContents()
  998.  
  999.     
  1000.     def CheckBox_stateChanged(self, i):
  1001.         for row in xrange(self.RemoveDevicesTableWidget.rowCount()):
  1002.             widget = self.RemoveDevicesTableWidget.cellWidget(row, 0)
  1003.             if widget.checkState() == Qt.Checked:
  1004.                 self.NextButton.setEnabled(True)
  1005.                 break
  1006.                 continue
  1007.         
  1008.  
  1009.     
  1010.     def NextButton_clicked(self):
  1011.         p = self.StackedWidget.currentIndex()
  1012.         if p == PAGE_DISCOVERY:
  1013.             self.manual = self.ManualGroupBox.isChecked()
  1014.             self.param = unicode(self.ManualParamLineEdit.text())
  1015.             self.jd_port = self.JetDirectSpinBox.value()
  1016.             self.search = unicode(self.SearchLineEdit.text())
  1017.             self.device_desc = int(self.DeviceTypeComboBox.itemData(self.DeviceTypeComboBox.currentIndex()).toInt()[0])
  1018.             self.discovery_method = self.NetworkDiscoveryMethodComboBox.currentIndex()
  1019.             if self.WirelessButton.isChecked():
  1020.                 dlg = WifiSetupDialog(self, device_uri = None, standalone = False)
  1021.                 dlg.exec_()
  1022.                 if dlg.success == SUCCESS_CONNECTED:
  1023.                     self.manual = True
  1024.                     self.param = dlg.hn
  1025.                     self.bus = 'net'
  1026.                 
  1027.             
  1028.             self.showDevicesPage()
  1029.         elif p == PAGE_DEVICES:
  1030.             row = self.DevicesTableWidget.currentRow()
  1031.             self.device_uri = self.DevicesTableWidget.item(row, 0).device_uri
  1032.             self.mq = device.queryModelByURI(self.device_uri)
  1033.             (back_end, is_hp, bus, model, serial, dev_file, host, zc, port) = device.parseDeviceURI(self.device_uri)
  1034.             self.model = models.normalizeModelName(model).lower()
  1035.             self.showAddPrinterPage()
  1036.         elif p == PAGE_ADD_PRINTER:
  1037.             self.print_test_page = self.SendTestPageCheckBox.isChecked()
  1038.             self.print_desc = unicode(self.PrinterDescriptionLineEdit.text()).encode('utf8')
  1039.             self.print_location = unicode(self.PrinterLocationLineEdit.text()).encode('utf8')
  1040.             self.fax_setup = self.SetupFaxGroupBox.isChecked()
  1041.             self.fax_desc = unicode(self.FaxDescriptionLineEdit.text()).encode('utf8')
  1042.             self.fax_location = unicode(self.FaxLocationLineEdit.text()).encode('utf8')
  1043.             self.fax_name_company = unicode(self.NameCompanyLineEdit.text()).encode('utf8')
  1044.             self.fax_number = unicode(self.FaxNumberLineEdit.text()).encode('utf8')
  1045.             self.addPrinter()
  1046.         elif p == PAGE_REMOVE:
  1047.             for row in xrange(self.RemoveDevicesTableWidget.rowCount()):
  1048.                 widget = self.RemoveDevicesTableWidget.cellWidget(row, 0)
  1049.                 if widget.checkState() == Qt.Checked:
  1050.                     item = self.RemoveDevicesTableWidget.item(row, 1)
  1051.                     printer = unicode(item.data(Qt.UserRole).toString()).encode('utf-8')
  1052.                     log.debug('Removing printer: %s' % printer)
  1053.                     cups.delPrinter(printer)
  1054.                     continue
  1055.             
  1056.             self.close()
  1057.         else:
  1058.             log.error('Invalid page!')
  1059.  
  1060.     
  1061.     def BackButton_clicked(self):
  1062.         p = self.StackedWidget.currentIndex()
  1063.         if p == PAGE_DEVICES:
  1064.             self.devices = { }
  1065.             self.showDiscoveryPage()
  1066.         elif p == PAGE_ADD_PRINTER:
  1067.             self.showDevicesPage()
  1068.         else:
  1069.             log.error('Invalid page!')
  1070.  
  1071.     
  1072.     def CancelButton_clicked(self):
  1073.         self.close()
  1074.  
  1075.     
  1076.     def displayPage(self, page):
  1077.         self.StackedWidget.setCurrentIndex(page)
  1078.         self.updateStepText(page)
  1079.  
  1080.     
  1081.     def setNextButton(self, typ = BUTTON_FINISH):
  1082.         if typ == BUTTON_ADD_PRINTER:
  1083.             self.NextButton.setText(self._SetupDialog__tr('Add Printer'))
  1084.         elif typ == BUTTON_NEXT:
  1085.             self.NextButton.setText(self._SetupDialog__tr('Next >'))
  1086.         elif typ == BUTTON_FINISH:
  1087.             self.NextButton.setText(self._SetupDialog__tr('Finish'))
  1088.         elif typ == BUTTON_REMOVE:
  1089.             self.NextButton.setText(self._SetupDialog__tr('Remove'))
  1090.         
  1091.  
  1092.     
  1093.     def updateStepText(self, p):
  1094.         self.StepText.setText(self._SetupDialog__tr('Step %1 of %2').arg(p + 1).arg(self.max_page + 1))
  1095.  
  1096.     
  1097.     def __tr(self, s, c = None):
  1098.         return qApp.translate('SetupDialog', s, c)
  1099.  
  1100.  
  1101.